package utils

import (
	"fmt"
	"time"

	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/disk"
	"github.com/shirou/gopsutil/host"
	"github.com/shirou/gopsutil/mem"
)

type CPUInfo struct {
	CPU       int32
	Counts    int32
	ModelName string
}

/**
通用方法，可在Linux和windows中直接调用
*/

// 获取CPU基础信息
func CpuInfo() ([]CPUInfo, error) {
	info, err := cpu.Info()
	if err != nil {
		return nil, err
	} else {
		var ret []CPUInfo
		for _, v := range info {
			cpu := CPUInfo{
				CPU:       v.CPU,
				Counts:    v.Cores,
				ModelName: v.ModelName,
			}
			ret = append(ret, cpu)
		}
		return ret, nil
	}
}

// cpu整体使用率百分比
func CpuPercent() (string, error) {
	p, err := cpu.Percent(time.Duration(time.Second), false)
	if err != nil {
		return "", err
	} else {
		usage_rate := fmt.Sprintf("%.2f", p[0])
		return usage_rate, nil
	}
}

// 返回CPU使用情况，false为总百分比，true 输出所有逻辑处理器的百分比信息
func CPUTimes() ([]cpu.TimesStat, error) {
	sys, err := cpu.Times(false)
	if err != nil {
		return nil, err
	} else {
		return sys, nil
	}
}

/*=================内存=================*/
// 内存信息，这里抛弃了交换分区信息，因为交换分区信息在Linux上并不常用。
func MeniryInfo() (*mem.VirtualMemoryStat, error) {
	// 交换内存信息
	// info, err := mem.SwapMemory()

	// if err != nil {
	// 	fmt.Println(err)
	// } else {
	// 	fmt.Printf("info: %v\n", info)
	// }

	// 物理内存信息
	virtual_info, err := mem.VirtualMemory()
	if err != nil {
		fmt.Println(err)
		return nil, err
	} else {
		// fmt.Printf("virtual_info: %v\n", virtual_info)
		return virtual_info, nil
	}

}

// 主机信息
func HostInfo() (*host.InfoStat, error) {
	host_info, err := host.Info()
	if err != nil {
		return nil, err
	} else {
		return host_info, nil
	}

}

// 整体磁盘信息概述
func DiskInfo() ([]map[string]interface{}, error) {
	// 获取磁盘分区，磁盘使用率和磁盘IO信息
	d1, err := disk.Partitions(true) // 所有分区
	var disk_info []map[string]interface{}
	if err != nil {
		return nil, err
	} else {
		for _, item := range d1 {
			d2, err := disk.Usage(item.Mountpoint) // 磁盘使用率
			if err != nil {
				fmt.Println(err)
			} else {
				total := d2.Total / 1024 / 1024 / 1024 // 分区总大小，单位GB
				disk_info = append(disk_info, map[string]interface{}{"disk_name": item.Device, "disk_total": total, "fstype": item.Fstype})

			}
		}
		return disk_info, nil
	}
}

// 所有磁盘IO信息
func DiskIO() (map[string]disk.IOCountersStat, error) {
	// 获取磁盘分区，磁盘使用率和磁盘IO信息

	d3, err := disk.IOCounters()
	if err != nil {
		return nil, err
	} else {
		return d3, nil
	}
}
